﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace WBasicClassLib.ExtFunctions
{
    namespace ExtObject
    {
        /// <summary>
        /// 对Object对象包括泛型的扩展，注意这个扩展的应用范围可以扩大到任何从object继承过来的类上
        /// </summary>
        public static class ExtObject
        {
            #region 判断某一个元素是否存在于一个集合之中

            /// <summary>
            /// 判断某一个元素是否存在于一个集合之中
            /// </summary>
            /// <typeparam name="T">集合的元素类型</typeparam>
            /// <param name="o">要参加判断的元素</param>
            /// <param name="Collection">要参加判断的集合（可以是多参数）</param>
            /// <returns>若存在于该集合中则返回true，否则为false</returns>
            public static bool In<T>(this T o, params T[] Collection)
            {
                return Collection.Any(i => i.Equals(o));
            }

            #endregion

            #region 判断一个元素是否处在一个范围中

            /// <summary>
            /// 判断一个元素是否处在一个范围中
            /// </summary>
            /// <typeparam name="T">待判断元素类型</typeparam>
            /// <param name="o">待判断元素</param>
            /// <param name="Min">下界</param>
            /// <param name="Max">上界</param>
            /// <returns>若待判断元素处在上界和下界之间（闭区间），则返回True，否则返回False</returns>
            public static bool InRange<T>(this IComparable<T> o, T Min, T Max)
            {
                return o.CompareTo(Min) >= 0 && o.CompareTo(Max) <= 0;
            }

            #endregion

            #region 遍历集合元素

            /// <summary>
            /// 遍历集合元素（注意！对值类型无法进行修改操作！）
            /// </summary>
            /// <typeparam name="T">集合元素类型</typeparam>
            /// <param name="source">待遍历集合</param>
            /// <param name="action">遍及集合时所使用的单参数无返回值方法</param>
            public static void ForEach<T>(this IEnumerable<T> source, Action<T> action)
            {
                foreach (T element in source)  
                    action(element); 
            }

            #endregion
        }
    }
}
